package algorithm7.leetcode.每日一题.YEAR2023.month5;

import org.junit.jupiter.api.Test;

import java.util.Arrays;
import java.util.HashMap;

/**
 * @author merrick.peng
 */
public class DAY20230525_LC2451 {
    /*
    给你一个字符串数组 words ，每一个字符串长度都相同，令所有字符串的长度都为 n 。
    每个字符串 words[i] 可以被转化为一个长度为 n - 1 的 差值整数数组 difference[i] ，其中对于 0 <= j <= n - 2 有 difference[i][j] = words[i][j+1] - words[i][j] 。
        注意两个字母的差值定义为它们在字母表中 位置 之差，也就是说 'a' 的位置是 0 ，'b' 的位置是 1 ，'z' 的位置是 25 。
    比方说，字符串 "acb" 的差值整数数组是 [2 - 0, 1 - 2] = [2, -1] 。
    words 中所有字符串 除了一个字符串以外 ，其他字符串的差值整数数组都相同。你需要找到那个不同的字符串。
    请你返回 words中 差值整数数组 不同的字符串。

    示例 1：
    输入：words = ["adc","wzy","abc"]
    输出："abc"
    解释：
    - "adc" 的差值整数数组是 [3 - 0, 2 - 3] = [3, -1] 。
    - "wzy" 的差值整数数组是 [25 - 22, 24 - 25]= [3, -1] 。
    - "abc" 的差值整数数组是 [1 - 0, 2 - 1] = [1, 1] 。
    不同的数组是 [1, 1]，所以返回对应的字符串，"abc"。
     */

    public String oddString(String[] words) {
//        return handle1(words);
        return handle2(words);
    }

    private String handle2(String[] words) {
        int[] diff0 = get(words[0]);
        int[] diff1 = get(words[1]);
        if (Arrays.equals(diff0, diff1)) {
            for (int i = 2; i < words.length; i++) {
                if (!Arrays.equals(diff0, get(words[i]))) {
                    return words[i];
                }
            }
        }
        return Arrays.equals(diff0, get(words[2])) ? words[1] : words[0];
    }
    public int[] get(String word) {
        int[] diff = new int[word.length() - 1];
        for (int i = 0; i + 1 < word.length(); i++) {
            diff[i] = word.charAt(i + 1) - word.charAt(i);
        }
        return diff;
    }


    private String handle1(String[] words) {
        int len = words.length;
        int n = words[0].length();
        String[][] diff = new String[len][2];
        for (int i = 0; i < len; i++) {
            StringBuilder sb = new StringBuilder();
            for (int j = 1; j < n; j++) {
                int dif = words[i].charAt(j) - words[i].charAt(j - 1);
                sb.append(dif);
                sb.append(",");
            }
            diff[i][0] = sb.toString();
            diff[i][1] = String.valueOf(i);
        }
        HashMap<String, Integer> map = new HashMap<>();
        for (String[] d : diff) {
            map.put(d[0], map.getOrDefault(d[0], 0) + 1);
        }
        for (String key : map.keySet()) {
            if (map.get(key) == 1) {
                for (int i = 0; i < diff.length; i++) {
                    if (diff[i][0].equals(key)) {
                        return words[Integer.valueOf(diff[i][1])];
                    }
                }
            }
        }
        return null;
    }

    @Test
    void t() {
//        String[] words = {"adc","wzy","abc"};
        String[] words = {"abm","bcn","alm"};
        String res = oddString(words);
        System.out.println("res = " + res);
    }
}
